bitkeeper revision 1.1159.1.477 (41bf20d2wgoxIqhcE0nzBC8W-yFPhg)
authorcl349@arcadians.cl.cam.ac.uk <cl349@arcadians.cl.cam.ac.uk>
Tue, 14 Dec 2004 17:20:18 +0000 (17:20 +0000)
committercl349@arcadians.cl.cam.ac.uk <cl349@arcadians.cl.cam.ac.uk>
Tue, 14 Dec 2004 17:20:18 +0000 (17:20 +0000)
sync w/ head.

14 files changed:
1  2 
.rootkeys
linux-2.6.9-xen-sparse/arch/xen/i386/kernel/traps.c
xen/arch/x86/domain.c
xen/arch/x86/setup.c
xen/arch/x86/smpboot.c
xen/arch/x86/traps.c
xen/arch/x86/x86_32/entry.S
xen/common/domain.c
xen/common/physdev.c
xen/include/asm-x86/processor.h
xen/include/asm-x86/x86_32/current.h
xen/include/public/dom0_ops.h
xen/include/xen/domain.h
xen/include/xen/sched.h

diff --cc .rootkeys
Simple merge
index a459c50fcd2463abf4e81a37bbbeaf72831619c5,964062cb89a426437f6337c8901a20b362f4bae9..3122bc796ace5c699705c7f9fb014d9f725ab9c4
@@@ -213,29 -194,49 +194,49 @@@ void machine_halt(void
  
  void free_perdomain_pt(struct domain *d)
  {
 -    free_xenheap_page((unsigned long)d->mm.perdomain_pt);
 +    free_xenheap_page((unsigned long)d->mm_perdomain_pt);
  }
  
- void arch_do_createdomain(struct exec_domain *ed)
+ static void continue_idle_task(struct domain *d)
+ {
+     reset_stack_and_jump(idle_loop);
+ }
+ static void continue_nonidle_task(struct domain *d)
+ {
+     reset_stack_and_jump(ret_from_intr);
+ }
 -void arch_do_createdomain(struct domain *d)
  {
-     d->shared_info = (void *)alloc_xenheap_page();
-     memset(d->shared_info, 0, PAGE_SIZE);
-     ed->vcpu_info = &d->shared_info->vcpu_data[ed->eid];
-     d->shared_info->arch.mfn_to_pfn_start = 
-       virt_to_phys(&machine_to_phys_mapping[0])>>PAGE_SHIFT;
-     SHARE_PFN_WITH_DOMAIN(virt_to_page(d->shared_info), d);
-     machine_to_phys_mapping[virt_to_phys(d->shared_info) >> 
-                            PAGE_SHIFT] = INVALID_P2M_ENTRY;
-     d->mm_perdomain_pt = (l1_pgentry_t *)alloc_xenheap_page();
-     memset(d->mm_perdomain_pt, 0, PAGE_SIZE);
-     machine_to_phys_mapping[virt_to_phys(d->mm_perdomain_pt) >> 
-                            PAGE_SHIFT] = INVALID_P2M_ENTRY;
-     ed->mm.perdomain_ptes = d->mm_perdomain_pt;
 +    struct domain *d = ed->domain;
 -        d->mm.perdomain_pt = (l1_pgentry_t *)alloc_xenheap_page();
 -        memset(d->mm.perdomain_pt, 0, PAGE_SIZE);
 -        machine_to_phys_mapping[virt_to_phys(d->mm.perdomain_pt) >> 
+ #ifdef ARCH_HAS_FAST_TRAP
+     SET_DEFAULT_FAST_TRAP(&d->thread);
+ #endif
+     if ( d->id == IDLE_DOMAIN_ID )
+     {
+         d->thread.schedule_tail = continue_idle_task;
+     }
+     else
+     {
+         d->thread.schedule_tail = continue_nonidle_task;
+         d->shared_info = (void *)alloc_xenheap_page();
+         memset(d->shared_info, 0, PAGE_SIZE);
++        ed->vcpu_info = &d->shared_info->vcpu_data[ed->eid];
+         d->shared_info->arch.mfn_to_pfn_start = 
+             virt_to_phys(&machine_to_phys_mapping[0])>>PAGE_SHIFT;
+         SHARE_PFN_WITH_DOMAIN(virt_to_page(d->shared_info), d);
+         machine_to_phys_mapping[virt_to_phys(d->shared_info) >> 
+                                PAGE_SHIFT] = INVALID_P2M_ENTRY;
 -    }
++        d->mm_perdomain_pt = (l1_pgentry_t *)alloc_xenheap_page();
++        memset(d->mm_perdomain_pt, 0, PAGE_SIZE);
++        machine_to_phys_mapping[virt_to_phys(d->mm_perdomain_pt) >> 
+                                PAGE_SHIFT] = INVALID_P2M_ENTRY;
  }
  
 -int arch_final_setup_guestos(struct domain *d, full_execution_context_t *c)
 +int arch_final_setup_guestos(struct exec_domain *d, full_execution_context_t *c)
  {
      unsigned long phys_basetab;
      int i, rc;
Simple merge
index ef3409995f088787a811e3090113132806ea1b0f,991b5c577a93390bd20ffff7b7fa001d652896e2..5609a118ed02696113e95cf9115933dcc746a337
@@@ -665,11 -662,7 +665,7 @@@ static void __init do_boot_cpu (int api
  
      map_cpu_to_boot_apicid(cpu, apicid);
  
- #if defined(__i386__)
-     SET_DEFAULT_FAST_TRAP(&ed->thread);
- #endif
 -    idle_task[cpu] = idle;
 +    idle_task[cpu] = ed;
  
      /* start_eip had better be page-aligned! */
      start_eip = setup_trampoline();
Simple merge
index 7a5bac7b915216cf807753cd73849b611c15e378,d3df231fbb91ea1f35463baba8b32b748749d806..b63d8203a0e19982f76420b534108d2cc63d514f
          andl $~3,reg;      \
          movl (reg),reg;
  
- ENTRY(continue_nonidle_task)
-         GET_CURRENT(%ebx)
-         jmp test_all_events
          ALIGN
  restore_all_guest:
 -        testb $TF_failsafe_return,DOMAIN_thread_flags(%ebx)
 +        testb $TF_failsafe_return,EDOMAIN_thread_flags(%ebx)
          jnz  failsafe_callback
          testl $X86_EFLAGS_VM,XREGS_eflags(%esp)
          jnz  restore_all_vm86
index 4d5dbdf33cc64b9e675949a7d2e98e0e6e3aaad3,ed18817cec252f661dc7186cbde3917665f39e2b..82963c4c6b425922d7d6f2d2a66c52e63129f11e
@@@ -55,6 -47,18 +55,18 @@@ struct domain *do_createdomain(domid_t 
      /* Per-domain PCI-device list. */
      spin_lock_init(&d->pcidev_lock);
      INIT_LIST_HEAD(&d->pcidev_list);
 -    arch_do_createdomain(d);
+     
+     if ( (d->id != IDLE_DOMAIN_ID) &&
+          ((init_event_channels(d) != 0) || (grant_table_create(d) != 0)) )
+     {
+         destroy_event_channels(d);
+         free_domain_struct(d);
+         return NULL;
+     }
+     
 -    sched_add_domain(d);
++    arch_do_createdomain(ed);
+     
++    sched_add_domain(ed);
  
      if ( d->id != IDLE_DOMAIN_ID )
      {
Simple merge
index 31c922d6b7a8c63c9aacf0b8f15eb4c4eb583a8f,ae5b13b7d1a3900112e0565364e068ab65c92372..8bed35020c9a1181e2b204d1d9799eed2b318e16
@@@ -455,11 -456,9 +457,9 @@@ extern struct desc_struct *idt_tables[]
              &((_p)->fast_trap_desc), 8))
  #endif
  
 -long set_fast_trap(struct domain *p, int idx);
 +long set_fast_trap(struct exec_domain *p, int idx);
  
- #define INIT_THREAD  { fast_trap_idx: 0x20 }
- #elif defined(__x86_64__)
+ #endif
  
  #define INIT_THREAD { 0 }
  
Simple merge
Simple merge
index 0000000000000000000000000000000000000000,5ff5ed62ad04bd87de6a7da66e3ca24eb36c231b..a91b44ce7844ea8f443a00c04d6d60fa2d4c7014
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,20 +1,20 @@@
 -extern void arch_do_createdomain(struct domain *d);
+ #ifndef __XEN_DOMAIN_H__
+ #define __XEN_DOMAIN_H__
+ /*
+  * Arch-specifics.
+  */
 -    struct domain *d, full_execution_context_t *c);
++extern void arch_do_createdomain(struct exec_domain *d);
+ extern int  arch_final_setup_guestos(
++    struct exec_domain *d, full_execution_context_t *c);
+ extern void free_perdomain_pt(struct domain *d);
+ extern void domain_relinquish_memory(struct domain *d);
+ #endif /* __XEN_DOMAIN_H__ */
Simple merge